#include <clutter/clutter.h>
#include <clutter-gtk/clutter-gtk.h> 
#include <stdlib.h>

#define UNUSED(x) (void)x 


ClutterActor * stage = NULL;

/* 这是上次stage的callback函数，给出鼠标点击的坐标位置，我们在这里省略，避免代码太多 */ 
static gboolean on_stage_button_press (ClutterStage *stage,ClutterEvent *event, gpointer user_data)
{
    float x = 0;
    float y = 0;
    UNUSED(stage);
    UNUSED(user_data);
    clutter_event_get_coords (event, &x, &y);

    g_print ("Event: %d(%s) , Stage clicked at (%f, %f) \n", event->type, 
     event->type==CLUTTER_BUTTON_PRESS ? "CLUTTER_BUTTON_PRESS" : "", x, y);

    return TRUE; /* Stop further handling of this event. */ 
}

/* 这是按键后的处理，当GTK+的按钮触发后，改变clutter stage的颜色。可快速略过。*/ 
static gboolean on_button_clicked(GtkButton * button, gpointer user_data)
{
    UNUSED(button);
    UNUSED(user_data);
    static gboolean already_changed = FALSE;
 
    if(already_changed) {
            ClutterColor stage_color ={0x00,0x00,0x00,0xff};
            clutter_actor_set_background_color(CLUTTER_ACTOR(stage),&stage_color);
    }else {
            ClutterColor stage_color ={0x20,0x20,0xA0,0xff};
            clutter_actor_set_background_color(CLUTTER_ACTOR(stage),&stage_color);
    }

    already_changed = ! already_changed;
    return TRUE;
}

int main(int argc, char * argv[])
{
    int ret = 0;
    ClutterColor stage_color ={0x00,0x00,0x00,0xff};

    /* 这个小程序，允许Clutter和GTK共同使用，将使用到clutter-gtk的资源
     * 因此在初始化中和纯Clutter有差异,它包含gtk_init  */ 
    ret = gtk_clutter_init(&argc,&argv);
    if( ret < 0 )
    {
        perror("gtk_clutter_init Err:");
        return ret;
    }

    /* Create the window and some child widgets: */
    GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    /** 创建一个可以竖直存放子部件的容器 GtkBox : vbox，将其放入GTK窗口，并置为可视模式*/ 
    GtkWidget * vbox   = gtk_box_new(FALSE,6);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    gtk_widget_show(vbox);
     
    /** 创建一个GTK的button，加在vbox的最下端，并置为可视模式，同时加上按键触发回调函数 */
    GtkWidget *button = gtk_button_new_with_label("改变颜色");
    gtk_box_pack_end(GTK_BOX(vbox),button,FALSE,FALSE,0);
    gtk_widget_show(button);
    g_signal_connect(button,"clicked",G_CALLBACK(on_button_clicked),NULL);
    /* 注意窗口的这个回调函数，如果没有这个函数，我们在关闭窗口的时候，程序并没有退出。*/ 
    g_signal_connect(window,"hide",G_CALLBACK(gtk_main_quit),NULL);

    /** Clutter widget终于来了 
     * 生成一个可以在GTK加载的clutter小部件，并放入GTK的容器vbox中，置为可视模式，同时设置小部件的大小 */ 
    GtkWidget *clutter_widget = gtk_clutter_embed_new ();
    gtk_box_pack_start(GTK_BOX(vbox),clutter_widget,TRUE,TRUE,0);
    gtk_widget_show(clutter_widget);
    gtk_widget_set_size_request(clutter_widget,200,200); 
    /** 对于所有的Clutter，我们都应该至少有一个ClutterStage（从ClutterAction中衍生）， 
     * 这个例子从加入GTK的小部件GtkClutterEmbed中获取，剩下的操作在上个stage例子中都出现过 */
    stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(clutter_widget));
    clutter_actor_set_background_color(CLUTTER_ACTOR(stage),&stage_color);
    
    g_signal_connect(stage,"button-press-event", G_CALLBACK(on_stage_button_press),NULL);

    gtk_widget_show(GTK_WIDGET(window));

    clutter_actor_show(stage);

    /* 主窗口是GTK窗口，使用GKT的主循环来代替Clutter的主循环，Start the main loop, so we can respond to events: */ 
    gtk_main();

    return EXIT_SUCCESS;
}